package com.hu.system.converter;

import com.alibaba.excel.converters.Converter;
import com.alibaba.excel.enums.CellDataTypeEnum;
import com.alibaba.excel.metadata.GlobalConfiguration;
import com.alibaba.excel.metadata.data.ReadCellData;
import com.alibaba.excel.metadata.data.WriteCellData;
import com.alibaba.excel.metadata.property.ExcelContentProperty;
import com.hu.common.utils.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.math.BigDecimal;

/**
 * 容错Double转换器
 * 参考原ExcelUtil的转换逻辑
 * <p>
 * 转换规则（与原ExcelUtil保持一致）：
 * 1. 数字类型：直接转Double
 * 2. 字符串类型：尝试转换，失败返回null
 * 3. 空值：返回null
 * 4. 异常情况：返回null（不抛异常）
 *
 * @author hu-erp
 */
public class TolerantDoubleConverter implements Converter<Double> {

    private static final Logger log = LoggerFactory.getLogger(TolerantDoubleConverter.class);

    @Override
    public Class<Double> supportJavaTypeKey() {
        return Double.class;
    }

    @Override
    public CellDataTypeEnum supportExcelTypeKey() {
        return null; // 支持所有Excel类型
    }

    /**
     * 读取Excel时的转换
     * 参考ExcelUtil.getCellValue + Convert.toDouble逻辑
     */
    @Override
    public Double convertToJavaData(ReadCellData<?> cellData, ExcelContentProperty contentProperty,
                                    GlobalConfiguration globalConfiguration) {
        if (cellData == null) {
            return null;
        }

        try {
            Object val = "";

            // 第一步：根据单元格类型获取值（模拟getCellValue）
            switch (cellData.getType()) {
                case NUMBER:
                    // 数字类型（公式单元格会自动计算为结果值）
                    BigDecimal numberValue = cellData.getNumberValue();
                    if (numberValue != null) {
                        return numberValue.doubleValue();
                    }
                    break;

                case STRING:
                    // 字符串类型
                    String stringValue = cellData.getStringValue();
                    if (stringValue != null) {
                        val = stringValue.trim();
                    }
                    break;

                case BOOLEAN:
                    // 布尔类型：true=1.0, false=0.0
                    return cellData.getBooleanValue() ? 1.0 : 0.0;

                case ERROR:
                case EMPTY:
                default:
                    return null;
            }

            // 第二步：转换为Double（模拟Convert.toDouble）
            if (val == null) {
                return null;
            }

            String strVal = val.toString().trim();

            // 空值返回null
            if (strVal.isEmpty() || "null".equalsIgnoreCase(strVal)) {
                return null;
            }

            // 尝试转换
            try {
                return Double.valueOf(strVal);
            } catch (NumberFormatException e) {
                // 转换失败，返回null
                log.debug("无法转换 '{}' 为Double，返回null", strVal);
                return null;
            }

        } catch (Exception e) {
            // 异常情况返回null
            log.warn("转换Double失败，返回null", e);
            return null;
        }
    }

    /**
     * 写入Excel时的转换
     */
    @Override
    public WriteCellData<?> convertToExcelData(Double value, ExcelContentProperty contentProperty,
                                                GlobalConfiguration globalConfiguration) {
        if (value == null) {
            return new WriteCellData<>("");
        }
        // 转为String以确保兼容性
        return new WriteCellData<>(String.valueOf(value));
    }
}

